package com.xp.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xp.dto.NodeDefinitionDTO;
import com.xp.dto.NodeDefinitionRequest;
import com.xp.dto.NodeQueryRequest;
import com.xp.entity.NodeDefinition;

import java.util.List;
import java.util.Map;

/**
 * 节点定义服务接口
 * 提供节点定义的业务逻辑处理
 *
 * @author xp
 * @since 2024-01-01
 */
public interface NodeDefinitionService extends IService<NodeDefinition> {

    /**
     * 分页查询节点定义列表
     *
     * @param request 查询参数
     * @return 分页结果
     */
    IPage<NodeDefinitionDTO> getNodeDefinitionPage(NodeQueryRequest request);

    /**
     * 根据ID查询节点定义详情
     *
     * @param id 节点ID
     * @return 节点定义详情
     */
    NodeDefinitionDTO getNodeDefinitionById(Long id);

    /**
     * 根据节点编码查询节点定义
     *
     * @param nodeCode 节点编码
     * @return 节点定义
     */
    NodeDefinitionDTO getNodeDefinitionByCode(String nodeCode);

    /**
     * 根据节点编码和版本查询节点定义
     *
     * @param nodeCode 节点编码
     * @param version 版本号
     * @return 节点定义
     */
    NodeDefinitionDTO getNodeDefinitionByCodeAndVersion(String nodeCode, String version);

    /**
     * 创建节点定义
     *
     * @param request 节点定义请求参数
     * @return 创建的节点定义
     */
    NodeDefinitionDTO createNodeDefinition(NodeDefinitionRequest request);

    /**
     * 更新节点定义
     *
     * @param id 节点ID
     * @param request 节点定义请求参数
     * @return 更新的节点定义
     */
    NodeDefinitionDTO updateNodeDefinition(Long id, NodeDefinitionRequest request);

    /**
     * 删除节点定义
     *
     * @param id 节点ID
     * @return 是否删除成功
     */
    Boolean deleteNodeDefinition(Long id);

    /**
     * 批量删除节点定义
     *
     * @param ids 节点ID列表
     * @return 是否删除成功
     */
    Boolean batchDeleteNodeDefinitions(List<Long> ids);

    /**
     * 启用节点定义
     *
     * @param id 节点ID
     * @return 是否启用成功
     */
    Boolean enableNodeDefinition(Long id);

    /**
     * 禁用节点定义
     *
     * @param id 节点ID
     * @return 是否禁用成功
     */
    Boolean disableNodeDefinition(Long id);

    /**
     * 批量更新节点状态
     *
     * @param ids 节点ID列表
     * @param status 新状态
     * @return 是否更新成功
     */
    Boolean batchUpdateStatus(List<Long> ids, Integer status);

    /**
     * 复制节点定义
     *
     * @param sourceId 源节点ID
     * @param newNodeCode 新节点编码
     * @param newNodeName 新节点名称
     * @param newVersion 新版本号
     * @return 复制的节点定义
     */
    NodeDefinitionDTO copyNodeDefinition(Long sourceId, String newNodeCode, String newNodeName, String newVersion);

    /**
     * 根据节点类型查询节点定义列表
     *
     * @param nodeType 节点类型
     * @return 节点定义列表
     */
    List<NodeDefinitionDTO> getNodeDefinitionsByType(String nodeType);

    /**
     * 根据节点分类查询节点定义列表
     *
     * @param category 节点分类
     * @return 节点定义列表
     */
    List<NodeDefinitionDTO> getNodeDefinitionsByCategory(String category);

    /**
     * 查询所有启用的节点定义
     *
     * @return 节点定义列表
     */
    List<NodeDefinitionDTO> getEnabledNodeDefinitions();

    /**
     * 查询系统内置节点定义
     *
     * @return 节点定义列表
     */
    List<NodeDefinitionDTO> getSystemNodeDefinitions();

    /**
     * 查询自定义节点定义
     *
     * @return 节点定义列表
     */
    List<NodeDefinitionDTO> getCustomNodeDefinitions();

    /**
     * 获取节点分类列表
     *
     * @return 分类列表
     */
    List<String> getNodeCategories();

    /**
     * 获取节点类型列表
     *
     * @return 类型列表
     */
    List<String> getNodeTypes();

    /**
     * 获取节点定义统计信息
     *
     * @return 统计信息
     */
    Map<String, Object> getNodeDefinitionStatistics();

    /**
     * 获取分类统计信息
     *
     * @return 分类统计信息
     */
    List<Map<String, Object>> getCategoryStatistics();

    /**
     * 验证节点编码是否可用
     *
     * @param nodeCode 节点编码
     * @param excludeId 排除的ID（用于更新时检查）
     * @return 是否可用
     */
    Boolean validateNodeCode(String nodeCode, Long excludeId);

    /**
     * 验证节点配置Schema
     *
     * @param schema JSON Schema字符串
     * @return 验证结果
     */
    Boolean validateSchema(String schema);

    /**
     * 测试节点定义
     *
     * @param id 节点ID
     * @param testData 测试数据
     * @return 测试结果
     */
    Map<String, Object> testNodeDefinition(Long id, Map<String, Object> testData);

    /**
     * 导出节点定义
     *
     * @param ids 节点ID列表（为空则导出所有）
     * @return 导出数据
     */
    String exportNodeDefinitions(List<Long> ids);

    /**
     * 导入节点定义
     *
     * @param data 导入数据
     * @return 导入结果
     */
    Map<String, Object> importNodeDefinitions(String data);
}